const bcrypt = require('bcryptjs')
const { sequelize } = require('../../core/db')
const {Sequelize, Model} = require('sequelize')


class User extends Model {
  static async verifyEmailPassword(email, plainPassword) {
    const user = await User.findOne({
      where: {
        email
      }
    })

    // console.log('--user--')
    // console.log(user)
    if (!user) {
      throw new global.errs.AuthFailed('账号不存在')
    }
    const correct = bcrypt.compareSync(plainPassword, user.password)
    if (!correct) {
      throw new global.errs.AuthFailed('密码不正确')
    }
    return user
  }

  static async getUserByOpenid(openid) {
    const user = await User.findOne({
      where: {
        openid
      }
    })

    return user
  }

  static async registerByOpenid(openid) {
    return await User.create({
      openid
    })
  }

  
}

User.init({
  // 主键 关系型数据库
  // 主键 不能重复 最好是数字
  // 自动增长id编号 autoIncrement

  // 接口保护 权限 访问接口 Token
  // 自己设计的 id编号系统60001 60002 并发会存在问题的
  // 暴露 用户编号， 即使别人知道用户编号， 也无法攻击得到
  // 接口保护  权限  访问接口

  id: {
    type: Sequelize.INTEGER,
    primaryKey: true, // 设置为主键，不能重复
    autoIncrement: true, // 自动增长
  },
  nickname: Sequelize.STRING,
  email:{
    type: Sequelize.STRING(128),
    unique: true, // 唯一性
  },
  // 密码加密
  // const salt = bcrypt.genSaltSync(10)
  // // 明文 加密 防止彩虹工具
  // const psw = bcrypt.hashSync(v.get('body.password2'), salt)
  password: {
    // 扩展 设计模式 观察者模式
    // ES6 Reflect Vue3.0
    type: Sequelize.STRING(128),
    set(val) {
      const salt = bcrypt.genSaltSync(10)
      const psw = bcrypt.hashSync(val, salt)
      this.setDataValue(
        "password", psw
      )
    }
  }, 
  openid: {
    type: Sequelize.STRING(64),
    unique: true, // 唯一性
  }
}, {
  sequelize,
  tableName: 'user' // 重命名
})

module.exports = {
  User
}